package kaixo;

public class Core {

	Core(){
		
	}
	
	public static boolean analizar(Paquete[] enviados, Paquete[] recividos, byte[] recivido, Nodo nodo){
		Paquete paqueteRecivido = new Paquete(recivido);
		Paquete paqueteSinRespuesta = sacarPaqueteSinRespuesta(enviados,nodo.id);
		
		if(paqueteSinRespuesta!=null){
			if(paqueteSinRespuesta.getAction() == (paqueteRecivido.getAction()- 10) ){
				paqueteSinRespuesta.setWaitingForResponse(false);
				nodo.sumarConexionesRealizadas(1);
				nodo.setUltimoPdu(recivido);
				return false;
			} else if (floodAnalysis(enviados,recividos,paqueteRecivido,nodo)==true){
				nodo.setUltimoPdu(recivido);
				return true;
			} else {
				if((paqueteRecivido.getAction() == 0)||(paqueteRecivido.getAction() == 1)||(paqueteRecivido.getAction() == 2)||(paqueteRecivido.getAction() == 3)||(paqueteRecivido.getAction() == 4)||(paqueteRecivido.getAction() == 5)){
					nodo.setUltimoPdu(recivido);
					return false;
				} else{
					nodo.setUltimoPdu(recivido);
					nodo.flood++;
					nodo.conexionesFallidas++;
					return true;
				}
			}
		}else{
			if((paqueteRecivido.getAction() == 0)||(paqueteRecivido.getAction() == 1)||(paqueteRecivido.getAction() == 2)||(paqueteRecivido.getAction() == 3)||(paqueteRecivido.getAction() == 4)||(paqueteRecivido.getAction() == 5)){
				nodo.setUltimoPdu(recivido);
				return false;
			} else{
				nodo.setUltimoPdu(recivido);
				nodo.flood++;
				nodo.conexionesFallidas++;
				return true;
			}
		}
	}
	
	static boolean floodAnalysis(Paquete[] enviados, Paquete[] recividos, Paquete recivido, Nodo nodo){
		if((recivido.getAction() != 0)&&(recivido.getAction() != 1)&&(recivido.getAction() != 2)&&(recivido.getAction() != 3)&&(recivido.getAction() != 4)&&(recivido.getAction() != 5)&&(recivido.getAction() != 15)&&(recivido.getAction() != 14)&&(recivido.getAction() != 13)&&(recivido.getAction() != 12)&&(recivido.getAction() != 11)&&(recivido.getAction() != 10)){
			nodo.flood++;
			nodo.conexionesFallidas++;
			return true;
		} else if(sacarPaqueteSinRespuesta(enviados,recivido.getSource()) == null){
			nodo.flood++;
			nodo.conexionesFallidas++;
			return true;
		}	
		return false;
	}
	
	
	
	public static Paquete sacarPaqueteSinRespuesta(Paquete[] sendHistory, int Nodo){
    	int i=0;
    	boolean encontrado = false;
    	while((i<10) && (encontrado == false)){
    		if((sendHistory[i].getDestino()==Nodo)&&(sendHistory[i].waitingForResponse==true)){
    			encontrado = true;
    		}
    		i++;
    	}
    	if(encontrado == true){
    		return sendHistory[i-1];
    	} else {
    		return null;
    	}
    }
}
